/**
 * Cloudflare Workers - API代理
 *
 * 功能说明：
 * 1. 代理前端API请求到后端服务器
 * 2. 支持所有HTTP方法（GET、POST、PUT、DELETE等）
 * 3. 处理CORS跨域问题
 * 4. 支持页面访问和API请求的路由分发
 *
 * 部署域名：po.lianf.com
 * 后端API：tools.kikimami.com
 */

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

/**
 * 处理所有请求
 * @param {Request} request - 原始请求
 */
async function handleRequest(request) {
  const url = new URL(request.url)
  const path = url.pathname
  const hostname = url.hostname

  // 处理OPTIONS预检请求（CORS）
  if (request.method === 'OPTIONS') {
    return handleCORS(request)
  }

  // 路由分发
  // 1. API请求：/api/* 或 /crm/* 或 /cms/* 等后端路径
  if (isAPIRequest(path)) {
    return proxyAPIRequest(request, url)
  }

  // 2. 页面访问（根据域名和路径判断）
  // po.lianf.com/{token} -> 生产单预览
  // pi.lianf.com/{token} -> PI文件预览
  // 或者 /view/{token} 路径（向后兼容）
  if (isPageViewRequest(hostname, path)) {
    return handlePageView(request, url, hostname)
  }

  // 3. 其他请求：返回404
  return new Response('Not Found', { status: 404 })
}

/**
 * 判断是否为API请求
 * @param {string} path - 请求路径
 */
function isAPIRequest(path) {
  const apiPrefixes = [
    '/api/',
    '/crm/',
    '/cms/',
    '/erp/',
    '/orders/',
    '/chatbot/',
    '/eco/',
    '/auth2/',
    '/message/',
    '/facebook/',
    '/shopee/'
  ]
  return apiPrefixes.some(prefix => path.startsWith(prefix))
}

/**
 * 判断是否为页面查看请求
 * @param {string} hostname - 域名
 * @param {string} path - 请求路径
 */
function isPageViewRequest(hostname, path) {
  // 1. 支持子域名直接访问：po.lianf.com/{token} 或 pi.lianf.com/{token}
  if ((hostname === 'po.lianf.com' || hostname === 'pi.lianf.com') && isTokenPath(path)) {
    return true
  }

  // 2. 向后兼容：支持 /view/{token} 路径
  if (path.startsWith('/view/')) {
    return true
  }

  return false
}

/**
 * 判断路径是否为token格式（UUID或其他格式）
 * @param {string} path - 请求路径
 */
function isTokenPath(path) {
  // 移除开头的斜杠
  const token = path.replace(/^\//, '').replace(/\/$/, '')

  // 1. 如果是空路径或根路径，不是token
  if (!token || token === '') {
    return false
  }

  // 2. 如果包含斜杠（有多级路径），不是token
  if (token.includes('/')) {
    return false
  }

  // 3. 检查是否为UUID格式（可选，更严格的验证）
  // const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
  // return uuidRegex.test(token)

  // 4. 宽松验证：只要是单层路径且长度合理，就认为是token
  return token.length > 10 && token.length < 200
}

/**
 * 代理API请求到后端
 * @param {Request} request - 原始请求
 * @param {URL} url - 解析后的URL对象
 */
async function proxyAPIRequest(request, url) {
  // 构建后端API的完整URL
  const backendURL = `https://tools.kikimami.com${url.pathname}${url.search}`

  // 创建新的请求头，复制原始请求的所有headers
  const headers = new Headers(request.headers)

  // 确保Content-Type正确传递
  if (!headers.has('Content-Type') && request.method !== 'GET') {
    headers.set('Content-Type', 'application/json')
  }

  // 构建请求配置
  const requestInit = {
    method: request.method,
    headers: headers
  }

  // 对于POST、PUT、PATCH等有body的请求，传递body
  if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(request.method)) {
    requestInit.body = request.body
  }

  try {
    // 向后端发起请求
    const backendResponse = await fetch(backendURL, requestInit)

    // 创建新的响应，添加CORS头
    const response = new Response(backendResponse.body, backendResponse)

    // 添加CORS头
    response.headers.set('Access-Control-Allow-Origin', '*')
    response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
    response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, PTOKEN')
    response.headers.set('Access-Control-Max-Age', '86400')

    return response
  } catch (error) {
    // 错误处理
    return new Response(JSON.stringify({
      success: false,
      msg: `代理请求失败: ${error.message}`
    }), {
      status: 500,
      headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      }
    })
  }
}

/**
 * 处理页面访问（返回HTML）
 * @param {Request} request - 原始请求
 * @param {URL} url - 解析后的URL对象
 * @param {string} hostname - 域名
 */
async function handlePageView(request, url, hostname) {
  // 从路径中提取token
  let token = ''

  // 情况1：/view/{token} 格式（向后兼容）
  if (url.pathname.startsWith('/view/')) {
    const pathParts = url.pathname.split('/')
    token = pathParts[pathParts.length - 1]
  }
  // 情况2：po.lianf.com/{token} 或 pi.lianf.com/{token}
  else if (hostname === 'po.lianf.com' || hostname === 'pi.lianf.com') {
    token = url.pathname.replace(/^\//, '').replace(/\/$/, '')
  }

  // 使用productionorderview接口（po和pi都用同一个接口）
  const apiUrl = `https://tools.kikimami.com/crm/api/productionorderview/${token}/`

  try {
    const apiResponse = await fetch(apiUrl, {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json'
      }
    })

    const content = await apiResponse.text()

    return new Response(content, {
      status: apiResponse.status,
      headers: {
        'Content-Type': 'text/html;charset=UTF-8',
        'Cache-Control': 'no-cache'
      }
    })
  } catch (error) {
    return new Response(`
      <!DOCTYPE html>
      <html>
        <head>
          <meta charset="UTF-8">
          <title>加载失败</title>
        </head>
        <body>
          <h1>页面加载失败</h1>
          <p>域名: ${hostname}</p>
          <p>Token: ${token}</p>
          <p>错误信息: ${error.message}</p>
        </body>
      </html>
    `, {
      status: 500,
      headers: { 'Content-Type': 'text/html;charset=UTF-8' }
    })
  }
}

/**
 * 处理CORS预检请求
 * @param {Request} request - 原始请求
 */
function handleCORS(request) {
  return new Response(null, {
    status: 204,
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type, Authorization, PTOKEN',
      'Access-Control-Max-Age': '86400'
    }
  })
}
